package main

import (
	"fmt"
	"github.com/fatih/color"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"web-collect-server/config"
	"web-collect-server/entity"
	"web-collect-server/entity/model"
	"web-collect-server/global"
	routers "web-collect-server/router"
)

func main() {

	// 初始化 yaml 配置
	initConfig()
	// 初始化 mysql
	initMySqlDb()

	r := routers.InitRouter() // 初始化路由配置

	err := r.Run(":8180")
	if err != nil {
		fmt.Println("服务器启动失败!")
	}
}

func initMySqlDb() {
	mysqlInfo := global.Settings.MysqlInfo
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlInfo.Name, mysqlInfo.Password, mysqlInfo.Host,
		mysqlInfo.Port, mysqlInfo.DbName)
	color.Blue("dsn -> %+v", dsn)
	//dsn := "root:123456@tcp(127.0.0.1:3306)/web_collect?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		color.Red("数据库连接错误!")
		panic(err)
	}
	err = db.AutoMigrate(&model.Folder{}, &entity.BanDevice{}, &entity.User{})
	if err != nil {
		color.Red("数据库迁移失败!")
		panic(err)
	} //自动迁移 folder 表结构
	global.DB = db
	// 创建一个种子数据
	user := entity.User{Name: "admin", Password: "admin"}
	var count int64
	db.Model(&entity.User{}).Count(&count)
	if count == 0 {
		color.Blue("没有用户数据，我插入一条用户数据")
		result := db.Create(&user) // 通过数据的指针来创建
		if result.Error != nil {
			color.Red("数据库创建种子数据失败!")
			panic(result.Error)
		}
	} else {
		color.Yellow("有用户数据，我就不插入拉")
	}
}

func initConfig() {
	v := viper.New()
	v.AutomaticEnv()
	isProd := v.GetBool("IS_PROD")
	configFileName := "./settings-dev.yaml"
	if isProd {
		configFileName = "./settings-prod.yaml"
	}
	color.Blue("configFileName -> %+v", configFileName)
	v.SetConfigFile(configFileName)

	if err := v.ReadInConfig(); err != nil {
		panic(err)
	}
	serverConfig := config.Config{}
	// 给 serverConfig 赋值
	if err := v.Unmarshal(&serverConfig); err != nil {
		panic(err)
	}
	// 传递给全局变量
	global.Settings = serverConfig
	color.Blue("folder -> %+v", serverConfig.Folder)
}
